Verilog中的generate块

您所在的位置:网站首页 verilog specify Verilog中的generate块

Verilog中的generate块

2023-03-29 14:53| 来源: 网络整理| 查看: 265

generate块允许多个模块实例化或执行任何模块的条件实例化。它允许提供基于Verilog参数构建设计的能力。当同一操作或模块实例需要重复多次时,或者必须根据给定的Verilog参数有条件地包含某些代码时,这些语句特别方便。

generate块不能包含端口、参数、specparam声明或specify块。但是,允许使用其他模块项和其他generate块。所有generate块的实例化代码都在一个模块内进行,并且在关键字generate和endgenerate和之间进行编写。

生成的实例化可以具有模块、连续赋值、always或initial块和用户定义的语句。有两种类型的生成构造方式-循环语句和条件语句。

循环的生成 if-else的生成case的生成

下面举三个例子学习下这三种用法。

generate块中的循环

第一个例子中,半加法器将在另一个名为my_design的顶级设计模块中使用循环生成构造方式进行实例化N次。必须使用关键字genvar来声明循环变量,该关键字告诉工具,该变量将在generate块的详细构造过程中专门使用。

module ha (input a,b, output sum,cout); assign sum = a^b; assign cout= a&b; endmodule // A top level design that contains N instances of half adder module mydesign #(parameter N=4) ( input [N-1:0] a,b; output[N-1:0] sum,cout); // Declare a temporary loop varibale to be used during // generation and won't be available during simulation genvar i; // Generate for loop to instantiate N times generate for (i=0;i

generate块中的if-else

下面显示的是一个示例,使用生成构造中的if-else在两个不同的多路复用器实现之间进行选择。第一个设计使用assign语句来实现mux,而第二个设计使用case语句。在顶层设计模块中定义了一个名为USE_CASE的参数,用于在这两个选项之间进行选择。

// Design #1: multiplexer design uses an "assign" statement to assign // out signal module mux_assign (input a,b,sel, output out); assign out =sel ? a : b; // The initial display statement is used so that we know // which design got instantiated from simulation logs initial $display("mux_assign is instanted"); endmodule // Design #2: multiplexer design uses an "case" statement to drive // out signal module mux_case (input a,b,sel, output reg out); always @(a or b or sel) begin case (sel) 0: out


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3